﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace ZYO
{
    public class ZYObject : Object
    {
        //在 ZYObject 初始化
        private int pID;
        public int ID			// 唯一的标识，并用于计算
        {
            get { return pID; }
            set
            {
                pID = value;
                pName = ID2Name(pID);
            }
        }

        private String pName;
        public String Name		// 名称，也可能用于计算
        {
            get { return pName; }
            set
            {
                pName = value;
                pID = Name2ID(pName);
            }
        }
        internal bool isYang;
        //internal DataRow Row;
        ////在子类中初始化 (Default Constuctor)
        //internal ZYOEnum.字典表 DictTableName; //字典表名
        internal int Sum;			//元素的总个数，如天干为10……


        //在子类中初始化(非默认 Constuctor)
        internal e五行 五行属性; // WuXing Property

        //Enum Type
        internal Type EnumType;

        public ZYObject()
        {
            preLoad();
            pID = -1;// will throw exception
            pName = String.Empty;
            postLoad();
        }

        public ZYObject(int iID)
        {
            preLoad();

            while (ID < 0)
            {
                ID += Sum * 10;
            }
            ID = (iID + Sum) % Sum;

            postLoad();
        }

        public ZYObject(String sName)
        {
            preLoad();

            Name = sName;

            postLoad();
        }

        internal virtual void preLoad() { }
        internal virtual void postLoad() 
        { 
            SetIsYang(ID); 
        }
        internal virtual  void SetIsYang(int iID)// Assign isYang
        {
            int y;
            y = iID % 2;

            isYang = y == 1 ? true : false;
        }


        //根据枚举类型。 通过 Name， 获取ID
        internal int Name2ID(String sName)
        {
            int i = (int)Enum.Parse(EnumType, sName, true);
            return i;
        }


        /// <summary>
        /// 根据枚举类型
        /// 通过已知ID 获取NAME
        /// </summary>
        /// <param name="iID"></param>
        /// <returns></returns>
        internal String ID2Name(int iID)
        {
            String retName = String.Empty;

            if (this.EnumType == typeof(e天干))
            {
                retName = ((e天干)iID).ToString();
            }
            if (this.EnumType == typeof(e地支))
            {
                retName = ((e地支)iID).ToString();
            }
            if (this.EnumType == typeof(e甲子))
            {
                retName = ((e甲子)iID).ToString();
            }
            if (this.EnumType == typeof(e五行))
            {
                retName = ((e五行)iID).ToString();
            }
            if (this.EnumType == typeof(e八卦ID))
            {
                retName = ((e八卦ID)iID).ToString();
            }
            if (this.EnumType == typeof(e节气))
            {
                retName = ((e节气)iID).ToString();
            }


            if (this.EnumType == typeof(e六十四卦ID))
            {
                retName = ((e六十四卦ID)iID).ToString();
            }


            return retName;

        }


        public override String ToString()
        {
            return this.Name;
        }

        internal String GetResourceString(String strRes)
        {
            String strRET = String.Empty;

            strRET = strRes.Split(';')[ID];

            return strRET;
        }
        public bool Equals(ZYObject zyo)
        {
            if (zyo == null)
            {
                return false;
            }
            else
            {
                return this.ID == zyo.ID;
            }
        }

        public static int operator -(ZYObject zy1, ZYObject zy2)
        {
            int delta = zy1.ID - zy2.ID;
            if (delta < 0)
                delta += zy1.Sum;


            return delta;
        }

        // override % operator
        public static int mod(int number, int basenumber)
        {
            int modresult = number % basenumber;

            while (modresult < 0)
            {
                modresult = modresult + basenumber;
            }
            if (0 == modresult)
            {
                modresult = basenumber;
            }

            return modresult;
        }

        //public static bool operator ==(ZYObject zy1, ZYObject zy2)
        //{
        //    return zy1.Equals(zy2);
        //}

        //public static bool operator !=(ZYObject zy1, ZYObject zy2)
        //{
        //    return (zy1.ID != zy2.ID);
        //}

        //public static bool operator >(ZYObject zy1, ZYObject zy2)
        //{
        //    return (zy1.ID > zy2.ID);
        //}
        //public static bool operator <(ZYObject zy1, ZYObject zy2)
        //{
        //    return (zy1.ID < zy2.ID);
        //}
        //public static bool operator >=(ZYObject zy1, ZYObject zy2)
        //{
        //    return (zy1.ID >= zy2.ID);
        //}
        //public static bool operator <=(ZYObject zy1, ZYObject zy2)
        //{
        //    return (zy1.ID <= zy2.ID);
        //}


    }
    /// <summary>
    /// Enum type of 天干
    /// </summary>

    public enum e天干
    {
        癸 = 0, 甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬
    }
    /// <summary>
    /// Enum type of 地支
    /// </summary>
    public enum e地支
    {
        亥 = 0, 子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌
    }
    /// <summary>
    /// Enum type of 五行
    /// </summary>
    public enum e五行
    {
        水 = 0, 木, 火, 土, 金
    }
    public enum e甲子
    {
        癸亥 = 0,
        甲子, 乙丑, 丙寅, 丁卯, 戊辰, 己巳, 庚午, 辛未, 壬申, 癸酉,
        甲戌, 乙亥, 丙子, 丁丑, 戊寅, 己卯, 庚辰, 辛巳, 壬午, 癸未,
        甲申, 乙酉, 丙戌, 丁亥, 戊子, 己丑, 庚寅, 辛卯, 壬辰, 癸巳,
        甲午, 乙未, 丙申, 丁酉, 戊戌, 己亥, 庚子, 辛丑, 壬寅, 癸卯,
        甲辰, 乙巳, 丙午, 丁未, 戊申, 己酉, 庚戌, 辛亥, 壬子, 癸丑,
        甲寅, 乙卯, 丙辰, 丁巳, 戊午, 己未, 庚申, 辛酉, 壬戌
    }

    public enum e节气
    {
        小寒 = 0, 大寒, 立春, 雨水, 惊蛰, 春分, 清明, 谷雨, 立夏, 小满, 芒种, 夏至, 小暑, 大暑, 立秋, 处暑, 白露, 秋分, 寒露, 霜降, 立冬, 小雪, 大雪, 冬至
    }
    public enum e八卦ID
    {
        坤 = 0, 震, 坎, 兑, 艮, 离, 巽, 乾
    }

    public enum e六十四卦ID
    {
        坤为地 = 0, 地雷复, 地水师, 地泽临, 地山谦, 地火明夷, 地风升, 地天泰,
        雷地豫, 震为雷, 雷水解, 雷泽归妹, 雷山小过, 雷火丰, 雷风恒, 雷天大壮,
        水地比, 水雷屯, 坎为水, 水泽节, 水山蹇, 水火既济, 水风井, 水天需,
        泽地萃, 泽雷随, 泽水困, 兑为泽, 泽山咸, 泽火革, 泽风大过, 泽天诀,
        山地剥, 山雷颐, 山水蒙, 山泽损, 艮为山, 山火贲, 山风蛊, 山天大畜,
        火地晋, 火雷噬嗑, 火水未济, 火泽睽, 火山旅, 离为火, 火风鼎, 火天大有,
        风地观, 风雷益, 风水涣, 风泽中孚, 风山渐, 风火家人, 巽为风, 风天小畜,
        天地否, 天雷无妄, 天水讼, 天泽履, 天山遁, 天火同人, 天风后, 乾为天
    }

    public enum e六十四卦by数
    {
        乾为天 = 1, 坤为地, 水雷屯, 山水蒙, 水天需, 天水讼, 地水师, 水地比, 
        风天小畜, 天泽履, 天地否, 地天泰, 天火同人, 火天大有, 地山谦, 雷地豫,
        泽雷随, 山风蛊, 地泽临, 风地观, 火雷噬嗑, 山火贲, 山地剥, 地雷复, 
        天雷无妄, 山天大畜, 山雷颐, 泽风大过, 坎为水, 离为火, 泽山咸, 雷风恒, 
        天山遁, 雷天大壮, 火地晋, 地火明夷, 风火家人, 火泽睽, 水山蹇, 雷水解, 
        山泽损, 风雷益, 泽天诀, 天风后, 泽地萃, 地风升, 泽水困, 水风井, 
        泽火革, 火风鼎, 震为雷, 艮为山, 风山渐, 雷泽归妹, 雷火丰, 火山旅, 
        巽为风, 兑为泽, 风水涣, 水泽节, 风泽中孚, 雷山小过, 水火既济, 火水未济
    }

    public class ZYOEnum
    {

        public enum e五行生克关系
        {
            比和 = 0,   //0	比和
            被生,       //1	被生
            被克,       //2	被克
            克,         //3	克	
            生,         //4	生
        }


        public enum e地支关系
        {
            比和 = 0,
            被生,
            被克,
            克,
            生,
            冲,
            合,
            刑
        }

        public enum e八字六神
        {
            日主,
            偏印,
            印授,
            煞,
            正官,
            食神,
            伤官,
            偏财,
            正财,
            比肩,
            劫财
        }

        public static e五行生克关系 Compair(e五行 wx1, e五行 wx2)
        {
            int ret = wx1 - wx2;
            if (ret < 0)
                ret = ret + 5; // the sum number is 5
            return (e五行生克关系)ret;
        }

        /// <summary>
        /// Enum type of 六神
        /// </summary>
        public enum e六神
        {
            兄弟 = 0, 子孙, 妻财, 官鬼, 父母
        }
        /// <summary>
        /// Enum type of Jia Zi
        /// </summary>

        public enum e先天八卦
        {
            乾 = 1, 兑, 离, 震, 巽, 坎, 艮, 坤
        }




        public enum e字典表
        {
            地支 = 0,
            天干,
            易经卦象,
            甲子,
            节气,
            九宫八卦,
            六十四卦,
            Count
        }

        public enum e起卦方法
        {
            摇卦,
            时间,
            测字,
            数字
        }

        public enum e元
        {
            上元 = 0,
            中元,
            下元
        }
    }

}
